package br.uff.javaavancado.modelos;

import java.io.Serializable;
import java.util.Set;
import javax.persistence.*;

@NamedQueries({@NamedQuery(name = "Cliente.getPorId",
    query = "select cli from Cliente cli where cli.id = ?"),
    @NamedQuery(name = "Cliente.getClienteComPedidos",
    query = "select cli from Cliente cli left outer join fetch cli.pedidos where cli.id = ?"),
    @NamedQuery(name = "Cliente.getClienteComPedidosEItensPedidos",
    query = "select cli from Cliente cli " +
    "left outer join fetch cli.pedidos pe " +
    "left outer join fetch pe.itens it where cli=?"),
    @NamedQuery(name = "Cliente.getClientePorLogin",
    query = "select cli from Cliente cli where login=?"),
//    @NamedQuery(name = "Cliente.getClienteComPedidoAberto",
//    query = "select cli from Cliente cli left outer join fetch cli.pedidos p inner join p on p.fechado=false where cli = ?"),
    @NamedQuery(name = "Cliente.getClientePorLoginESenhaComPedidosEItensPedidos",
    query = "select cli from Cliente cli " +
    "left outer join fetch cli.pedidos pe " +
    "left outer join fetch pe.itens it where login=? and senha=?")
})
@Entity
@Table(name = "java_cliente")
@SequenceGenerator(name = "Sequencia", sequenceName = "java_cliente_cod_seq")
public class Cliente implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "Sequencia")
    private Long id;
    private String nome;
    @Column(unique=true,nullable=false)
    private String login;
    @Column(nullable=false)
    private String senha;
    private String cartaoCredito;
    @Column(nullable=false)
    private boolean administrador;
    private String endereco;
    private String telefone;
    @Column(unique=true,nullable=false)
    private String cpf;
    @OneToMany(mappedBy = "cliente", targetEntity = Pedido.class)
    private Set<Pedido> pedidos;
    @Transient
    private Pedido pedidoAberto;

    public Cliente() {
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Pedido getPedidoAberto() {
        return pedidoAberto;
    }

    public void setPedidoAberto(Pedido pedidoAberto) {
        this.pedidoAberto = pedidoAberto;
    }

    public Set<Pedido> getPedidos() {
        return pedidos;
    }

    public void setPedidos(Set<Pedido> pedidos) {
        this.pedidos = pedidos;
    }

    public String getCartaoCredito() {
        return cartaoCredito;
    }

    public void setCartaoCredito(String cartaoCredito) {
        this.cartaoCredito = cartaoCredito;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getEndereco() {
        return endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public boolean isAdministrador() {
        return administrador;
    }

    public void setAdministrador(boolean administrador) {
        this.administrador = administrador;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }
}
